# 简化版字体解析脚本（仅处理TTF）

from fontTools.ttLib import TTFont
from fontTools.pens.svgPathPen import SVGPathPen
import os
import pandas as pd
from src.data_preprocessing.svg_constants import SVG_COMMANDS

def parse_fonts(raw_ttf_dir, output_svg_dir, metadata_path, full_svg=False):
    """处理 TTF 字体文件的主函数"""
    # 新增目录校验
    if not os.path.exists(raw_ttf_dir):
        raise ValueError(f"字体目录不存在: {raw_ttf_dir}")
    if not os.path.isdir(raw_ttf_dir):
        raise ValueError(f"路径不是目录: {raw_ttf_dir}")

    metadata = []
    
    for ttf_file in os.listdir(raw_ttf_dir):
        if not ttf_file.lower().endswith('.ttf'):  # 增加大小写不敏感判断
            continue
            
        font_path = os.path.join(raw_ttf_dir, ttf_file)
        font = TTFont(font_path)
        
        # 提取字体名称（去除扩展名）
        font_name = os.path.splitext(ttf_file)[0]
        
        # 处理单个字体文件
        _process_font(
            font=font,
            font_name=font_name,
            output_svg_dir=output_svg_dir,
            metadata=metadata,
            full_svg=full_svg
        )
        
    pd.DataFrame(metadata).to_csv(metadata_path, index=False)

def _process_font(font, font_name, output_svg_dir, metadata, full_svg):
    """处理单个字体文件的内部方法"""
    cmap = font.getBestCmap()
    glyph_set = font.getGlyphSet()
    
    # 创建字体专属目录（保留文件名中的序号）
    font_output_dir = os.path.join(output_svg_dir, font_name)
    os.makedirs(font_output_dir, exist_ok=True)

    # 获取字体度量信息
    units_per_em = font['head'].unitsPerEm
    transform = f"matrix(1 0 0 -1 0 {units_per_em})"  # 垂直翻转矩阵

    for code, name in cmap.items():
        try:
            safe_char = f"U+{code:04X}"
            glyph = glyph_set[name]
            pen = SVGPathPen(glyph_set)
            glyph.draw(pen)
            
            # 修改为使用SVG_COMMANDS常量
            svg_path = pen.getCommands()
            for cmd in SVG_COMMANDS:
                svg_path = svg_path.replace(cmd, f' {cmd} ')
            svg_path = ' '.join(svg_path.split())
            
            svg_filename = f"{safe_char}.svg"
            file_path = os.path.join(font_output_dir, svg_filename)

            if full_svg:
                content = f'''<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 {units_per_em} {units_per_em}">
                            <path d="{svg_path}"/>
                          </svg>'''
            else:
                content = f'''<path d="{svg_path}"/>'''

            with open(file_path, 'w') as f:
                f.write(content)
        except Exception as e:
            print(f"处理字符{safe_char}失败: {str(e)}")
            continue

        metadata.append({
            'font': font_name,
            'char': safe_char,
            'svg_path': os.path.join(font_name, svg_filename)
        })

if __name__ == "__main__":
    import argparse
    parser = argparse.ArgumentParser()
    parser.add_argument('--raw_ttf_dir', type=str, required=True)
    parser.add_argument('--output_svg_dir', type=str, required=True)
    parser.add_argument('--metadata_path', type=str, required=True)
    parser.add_argument('--full_svg', action='store_true', help='生成完整SVG文件（包含XML声明和坐标系变换）')
    
    args = parser.parse_args()
    
    args.raw_ttf_dir = os.path.abspath(args.raw_ttf_dir)
    args.output_svg_dir = os.path.abspath(args.output_svg_dir)
    
    if not os.path.exists(args.output_svg_dir):
        os.makedirs(args.output_svg_dir, exist_ok=True)
    
    parse_fonts(
        raw_ttf_dir=args.raw_ttf_dir,
        output_svg_dir=args.output_svg_dir,
        metadata_path=args.metadata_path,
        full_svg=args.full_svg
    )